到目前來說我們已經介紹了JSP和Servlet的基本使用。相信初學著來說比較喜歡使用JSP來直接製作頁面。因為1對於畫面呈現上面來說,他比較好寫,2因為通常有寫過Web的人,jsp那種模式的寫法每一個Web框架應該都有類似的。所以做起來很方便。
不過對於大型專案來說,只靠jsp來寫web是不行的,因為很多code沒有辦法reuse,造成不好維護。因此現在越來越多框架,例如MVC的概念是希望每一個部份有特定的做處理,讓程式的維護更好做。
接下來要介紹的JSTL是jsp裡面的標準Tag,而這些能夠讓我們的jsp頁面只關注與View的部份,同時因為Tag可以被reuse,讓我們在維護上面更加容易。
(和我部落格同時發佈:http://www.dotblogs.com.tw/alantsai/archive/2013/10/12/jstl-tag_introduction.aspx)
什麽是Tag
在進入JSTL之前我們需要先瞭解Tag是什麽。
還記得在介紹JSP的時候我們有介紹action element。而Action element從某種角度上來說和tag很相似。
Tag其實就是把常用的一些方法包裝起來,讓我們可以重複的使用。
爲什麽需要有Tag
或許你會說,我們不是已經有Scriptlet可以直接寫java 程式碼,爲什麽還要有tag?其實原因很簡單,當我們在JSP裡面使用scriptlet的時候,應該會發現程式碼很難被重複使用(當然你可以把方法包在java class然後在scriptlet裡面呼叫),同時在jsp裡面寫Scriptlet應該會發現和jsp頁面整個非常格格不入,例如說當你需要用scriptlet使用if來輸出不同的畫面的時候,應該會發現非常不好弄,尤其是如果輸出內容很長的時候,有時候會看不清楚那一段是在if裡面,那一段是在else裡面。
下面是一個使用JSTL和Scriptlet的對比:
基本作用很簡單,就是從進來的queryString判斷要顯示的內容是什麽。你應該可以想像如果今天表單比較長,用Scriptlet來輸出很難發現if的括弧範圍。
大家應該還記得EL(Expression Language)吧?寫EL來輸出內容是不是比用Scriptlet還要方便並且看起來更簡潔?但是EL有缺點,不能對集合做iteration的動作就很致命,同時EL也不能寫入(修改)值。不過這些問題都可以透過和Tag的搭配來解決。
最後,到目前為止希望大家已經看出來了希望Servlet的角色是MVC裡面的Controller,而JSP是View。因此,儘量讓jsp做好View做的事情是目標。
因此,官方不建議使用Scriptlet,鼓勵使用tag。
tag的結構
要使用tag會需要先使用taglib directive elment先指定我們的tag從哪裡來(URI)和要用什麽prefix作為告知此tag是執行哪一個。
tag的結構和一般的html tag一樣,差別只是他多了一個prefix表示此tag是從哪一個地方所來。
因此一個使用JSTL core的if會是:
<c:if test="${param.action == 'add'}">
</c:if>
可以看到prefix是c,然後他的attribute是test。應該看就滿瞭解他的作用。
什麽是JSTL
JSTL是JSP Standard Tag Library的縮寫,從名稱應該就可以看出來這個其實是一個標準的標籤庫,裡面包含了一些常會用到的,例如對集合做iteration或者對輸出做format。
tag當然可以自己寫,而它本身其實也只是method而已。不過我們會先瞭解JSTL提供了什麽給我們,然後再介紹自定義標籤。
使用JSTL所要做的準備
JSTL在Java EE 5之前只是一個額外的套件,所以要使用的時候會需要去oracle下載並且把對應的.jar放入WEB-INF/lib下面。
基本下載位置是:https://jstl.java.net/download.html。在StackOverflow有一個很好 的介紹JSTL版本和提供直接下載連接可以參考:<http://stackoverflow.com/tags/jstl/info >
在Java EE 5 之後的sdk,JSTL都有包括,所以不需要在額外下載。
這邊需要注意的是jdk和Java EE sdk是不一樣的東西。所以如果你只是裝了jdk,還是需要去下載JSTL。
JSTL提供了6個不同的tags供我們使用,因此我們要加入要使用的tag的URI和prefix才能夠開始使用。
其實使用JSTL和使用其他tag的方式都一樣。
結語
jsp tag對於jsp的重要性來說是毋容置疑的,尤其是需要寫一個比較漂亮的jsp頁面使用tag看起來會完全不一樣。
希望透過這一篇大家對於tag有基本瞭解,接下來我們會來介紹jstl裡面的tags。